package templateDesigner
import grails.converters.*
import archetypes.*
import grails.converters.*

/**
 *
 * @author Leandro Carrasco
 * 
 */
class HomeController {
    def archetypeService
    def layoutService
    
    //--------------------------------------------------------------------------
    
    def index = { 
        def layouts = layoutService.getLayouts() 
        
        def listadoLayouts = []
        layouts.each{elem ->
            def contenidoLayout = new String(elem.contenido.value.decodeBase64())
            def tableLayout = contenidoLayout.substring(contenidoLayout.indexOf("<table"), contenidoLayout.indexOf("</table>") + 8)
            
            def nombreArchivoLayout = elem.detalleArtefacto.value.nombreArchivo.value
            def numVersionLayout = elem.detalleArtefacto.value.numVersion.value
            def pathLayout = elem.detalleArtefacto.value.path.value
            
            listadoLayouts.add([layoutTable:tableLayout, nombreArchivo:nombreArchivoLayout, numVersion:numVersionLayout, path:pathLayout ])
        }
        
        render(view:'layout', model:[layouts: listadoLayouts])
    }
    
    //--------------------------------------------------------------------------
    
    def list = {
        String nombre = params['nombreArchivo'];
        String version = params['version'];
        String path = params['path'];
        
        if(nombre != null && version != null && path != null){
            String n = nombre
            String v = version
            String p = path
            def archetype = archetypeService.getArquetipo(n,v,p)
            Nodo nodo = archetypeService.archetype2Nodo(new String(archetype.contenido.value.decodeBase64()))
            def map = this.nodo2JSON(nodo)
            render map as JSON
        } else {
            def archetypes = archetypeService.getJerarquiaDetallesArtefacto()
            def map = this.jerarquiaDetallesArtefacto2JSON(archetypes.detallesArtefacto.value)                
            render map as JSON          
        }
    }
    
    /*************** Auxiliares ****************/
    private Map jerarquiaDetallesArtefacto2JSON(def raiz){
        def l        
                            
        if(raiz != null){
            def h = []                                                     
            
            raiz.nodoHijo.value.nodoDetallesArtefacto.each{
                h.add(jerarquiaDetallesArtefacto2JSON(it))                
            }
            
            raiz.detallesArtefactos.value.detallesArtefacto.each {                             
                def d = [
                    data:it.nombre.value, 
                    attr:[id:it.nombre.value, rel : "archetype"], 
                    metadata:[nombreArchivo:it.nombreArchivo.value,version:it.numVersion.value,path:it.path.value],                     
                ]
                h.add(d)
            }
            
            String icon
            if(raiz.nodoHijo.value.nodoDetallesArtefacto.size() != 0 || raiz.detallesArtefactos.value.detallesArtefacto.size() != 0){
                icon = "folder"
            } else {
                icon = "emptyfolder"
            }                        
                        
            l = [
                data:raiz.nombre.value, 
                attr:[id:raiz.nombre.value, rel : icon], 
                metadata:[nombre:raiz.nombre.value], 
                children:h
            ]
        }                                     
        return l    
    }
    
    private Map nodo2JSON(Nodo raiz){
        def l
        def metadata        
        def icons = [
            action:"action",
            cluster:"cluster",
            composition:"composition",
            dv_count:"count",
            dv_date_time:"datetime",
            dv_date:"datetime",
            duration:"duration",
            element:"element",
            evaluation:"evaluation",
            instruction:"instruction",
            observation:"observation",
            dvordinal:"ordinal",
            dvquantity:"quantity",
            section:"section",
            slot_cluster:"slot_cluster",
            structure:"structure",                             
            item_tree:"structure",
            dv_coded_text:"text",
            dv_text:"text",
            dv_boolean:"truefalse"
        ]
                            
        if(raiz != null){
            def h = []                   
            raiz.hijos.each{
                h.add(nodo2JSON(it))
            }     
            String icon = raiz.tipo != null && icons.keySet().contains(raiz.tipo.toLowerCase()) ? icons[raiz.tipo.toLowerCase()] : "default"; 
            String tipo = h.size() == 0 ? "hoja" : "nodo";
            
            switch(raiz.getInfoName()) {
                case "InfoArchetypeSlot":
                InfoArchetypeSlot i = ((InfoArchetypeSlot)raiz.info)
                metadata = [tipo:raiz.tipo, nombreArchivo:i.nombreArchivo,version:i.numVersion,path:i.path,isArchetype:true]                    
                break;
                    
                default:
                metadata = [tipo:raiz.tipo, path:raiz.path, isArchetype:false]
                break;
            }
                            
            l = [
                data:raiz.nombre, 
                attr:[id:raiz.identif, rel : icon], 
                metadata:metadata, 
                children:h
            ]                                    
        }
        return l    
    }
}
